/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Stubs;

import MainClass.Banco;
import MyExceptions.ExceptionContaInvalida;
import MyExceptions.ExceptionSaldoInsuficiente;
import MyExceptions.ExceptionSenhaInvalida;
import MyExceptions.ExceptionValorMuitoAlto;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 * @author Murilo
 */
public class StubServidor {
    private static Banco MeuBanco;
    public static void main(String[] args){

        try{
            String Senha;
            double Saldo, SaldoAtual = 0, ValorSaque = 0;
            int Acao, NumeroConta = 0;
            MeuBanco = new Banco("Banco Teste");
            System.out.println("Servidor iniciando...");
            ServerSocket server_socket = new ServerSocket(5000);
            
            while(true){
                System.out.println("Aguardando um cliente");
                Socket cliente = server_socket.accept(); //aceita conexão do cliente
                System.out.println("Cliente conectado " + cliente.getInetAddress().getHostAddress());

                DataInputStream canal_entrada = new DataInputStream(cliente.getInputStream());
                DataOutputStream canal_Saida = new DataOutputStream(cliente.getOutputStream());
                
                //verifica qual acao tomada pelo cliente
                Acao = canal_entrada.readInt();
                //Se 2 Cria uma conta pelo Gerente
                if(Acao == 2){
                    Senha = canal_entrada.readUTF();
                    Saldo = canal_entrada.readDouble();
                    System.out.println("Senha enviada é: " + Senha);
                    System.out.println("Saldo Inicial é: " + String.valueOf(Saldo));

                    try{
                        NumeroConta = MeuBanco.CriarConta(Senha, Saldo);
                    }catch(Exception ex){
                        canal_Saida.writeUTF(ex.getMessage());
                    }
                    canal_Saida.writeUTF("Sua conta foi criada!!!");
                    canal_Saida.writeInt(NumeroConta);
                    //Se 1 verifica Saldo pelo Gerente
                }else if(Acao == 1){
                    NumeroConta = canal_entrada.readInt();
                    try{
                        SaldoAtual = MeuBanco.VerificaSaldo(NumeroConta);
                    }catch(ExceptionContaInvalida ex){
                        System.out.println(ex.getMessage());
                        canal_Saida.writeUTF("Conta Inválida.");
                    }catch(Exception ex){
                        canal_Saida.writeUTF(ex.getMessage());
                    }
                    canal_Saida.writeUTF(String.valueOf(SaldoAtual));
                    //Se 3 verifica saldo pelo cliente
                }else if(Acao == 3){
                    NumeroConta = canal_entrada.readInt();
                    Senha = canal_entrada.readUTF();
                    try{
                        SaldoAtual = MeuBanco.VerificaSaldo(NumeroConta, Senha);
                        canal_Saida.writeUTF(String.valueOf(SaldoAtual));
                    }catch(ExceptionContaInvalida ex){
                        System.out.println(ex.getMessage());
                        canal_Saida.writeUTF("Conta Inválida.");
                    }catch(ExceptionSenhaInvalida ex){
                        System.out.println(ex.getMessage());
                        canal_Saida.writeUTF("Senha inválida");
                    }
                    catch(Exception ex){
                        canal_Saida.writeUTF(ex.getMessage());
                    }
                    
                }else if(Acao == 4){
                    NumeroConta = canal_entrada.readInt();
                    Senha = canal_entrada.readUTF();
                    ValorSaque = canal_entrada.readDouble();
                    try{
                        MeuBanco.Saque(NumeroConta, Senha, ValorSaque);
                    }catch(ExceptionContaInvalida ex){
                        System.out.println(ex.getMessage());
                        canal_Saida.writeUTF("Conta Inválida.");
                    }catch(ExceptionValorMuitoAlto ex){
                        System.out.println(ex.getMessage());
                        canal_Saida.writeUTF("Valor muito Alto.");
                    }catch(ExceptionSenhaInvalida ex){
                        System.out.println(ex.getMessage());
                        canal_Saida.writeUTF("Senha Inválida");
                    }catch(ExceptionSaldoInsuficiente ex){
                        System.out.println(ex.getMessage());
                        canal_Saida.writeUTF("Saldo Insuficiente");
                    }
                    catch(Exception ex){
                        canal_Saida.writeUTF(ex.getMessage());
                    }
                     canal_Saida.writeUTF("Saque realizado");
                }

                System.out.println("Servidor terminando.");
                canal_entrada.close();
                canal_Saida.close();
                cliente.close();
                //server_socket.close();
            }
            //server_socket.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
